index.page.tsx 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. import React, { type ReactNode, useMemo, type JSX } from 'react';
  2. import type {
  3. GetServerSideProps, GetServerSidePropsContext,
  4. } from 'next';
  5. import { useTranslation } from 'next-i18next';
  6. import dynamic from 'next/dynamic';
  7. import Head from 'next/head';
  8. import { useRouter } from 'next/router';
  9. import { BasicLayout } from '~/components/Layout/BasicLayout';
  10. import { GroundGlassBar } from '~/components/Navbar/GroundGlassBar';
  11. import type { CrowiRequest } from '~/interfaces/crowi-request';
  12. import type { BasicLayoutConfigurationProps } from '~/pages/basic-layout-page';
  13. import { getServerSideBasicLayoutProps } from '~/pages/basic-layout-page';
  14. import { useHydrateBasicLayoutConfigurationAtoms } from '~/pages/basic-layout-page/hydrate';
  15. import { useCustomTitle } from '~/pages/utils/page-title-customization';
  16. import { mergeGetServerSidePropsResults } from '~/pages/utils/server-side-props';
  17. import loggerFactory from '~/utils/logger';
  18. import type { NextPageWithLayout } from '../../_app.page';
  19. import type { CommonEachProps, CommonInitialProps } from '../../common-props';
  20. import {
  21. getServerSideCommonEachProps, getServerSideCommonInitialProps, getServerSideI18nProps,
  22. } from '../../common-props';
  23. import type { ServerConfigurationProps } from './types';
  24. import { useHydrateServerConfigurationAtoms } from './use-hydrate-server-configurations';
  25. const logger = loggerFactory('growi:pages:me');
  26. const PersonalSettings = dynamic(() => import('~/client/components/Me/PersonalSettings'), { ssr: false });
  27. // const MyDraftList = dynamic(() => import('~/components/MyDraftList/MyDraftList'), { ssr: false });
  28. const InAppNotificationPage = dynamic(
  29. () => import('~/client/components/InAppNotification/InAppNotificationPage').then(mod => mod.InAppNotificationPage), { ssr: false },
  30. );
  31. type Props = CommonInitialProps & CommonEachProps & BasicLayoutConfigurationProps & ServerConfigurationProps;
  32. const MePage: NextPageWithLayout<Props> = (props: Props) => {
  33. useHydrateServerConfigurationAtoms(props.serverConfig);
  34. const router = useRouter();
  35. const { t } = useTranslation(['translation', 'commons']);
  36. const { path } = router.query;
  37. const pagePathKeys: string[] = Array.isArray(path) ? path : ['personal-settings'];
  38. const mePagesMap = useMemo(() => {
  39. return {
  40. 'personal-settings': {
  41. title: t('User Settings'),
  42. component: <PersonalSettings />,
  43. },
  44. // drafts: {
  45. // title: t('My Drafts'),
  46. // component: <MyDraftList />,
  47. // },
  48. 'all-in-app-notifications': {
  49. title: t('commons:in_app_notification.notification_list'),
  50. component: <InAppNotificationPage />,
  51. },
  52. };
  53. }, [t]);
  54. const getTargetPageToRender = (pagesMap, keys): {title: string, component: JSX.Element} => {
  55. return keys.reduce((pagesMap, key) => {
  56. const page = pagesMap[key];
  57. if (page == null) {
  58. return {
  59. title: 'NotFoundPage',
  60. component: <h2>{t('commons:not_found_page.page_not_exist')}</h2>,
  61. };
  62. }
  63. return pagesMap[key];
  64. }, pagesMap);
  65. };
  66. const targetPage = getTargetPageToRender(mePagesMap, pagePathKeys);
  67. // // clear the cache for the current page
  68. // // in order to fix https://redmine.weseek.co.jp/issues/135811
  69. // useHydratePageAtoms(undefined);
  70. // useCurrentPathname('/me');
  71. const title = useCustomTitle(targetPage.title);
  72. return (
  73. <>
  74. <Head>
  75. <title>{title}</title>
  76. </Head>
  77. <div className="dynamic-layout-root">
  78. <GroundGlassBar className="sticky-top py-4"></GroundGlassBar>
  79. <div className="main ps-sidebar">
  80. <div className="container-lg wide-gutter-x-lg">
  81. <h1 className="sticky-top py-2 fs-3">{ targetPage.title }</h1>
  82. {targetPage.component}
  83. </div>
  84. </div>
  85. </div>
  86. </>
  87. );
  88. };
  89. type LayoutProps = Props & {
  90. children?: ReactNode
  91. }
  92. const Layout = ({ children, ...props }: LayoutProps): JSX.Element => {
  93. useHydrateBasicLayoutConfigurationAtoms(props.searchConfig, props.sidebarConfig, props.userUISettings);
  94. return (
  95. <BasicLayout>
  96. {children}
  97. </BasicLayout>
  98. );
  99. };
  100. MePage.getLayout = function getLayout(page) {
  101. return <Layout {...page.props}>{page}</Layout>;
  102. };
  103. const getServerSideConfigurationProps: GetServerSideProps<ServerConfigurationProps> = async(context: GetServerSidePropsContext) => {
  104. const req: CrowiRequest = context.req as CrowiRequest;
  105. const { crowi } = req;
  106. const { configManager } = crowi;
  107. return {
  108. props: {
  109. serverConfig: {
  110. registrationWhitelist: configManager.getConfig('security:registrationWhitelist'),
  111. showPageLimitationXL: configManager.getConfig('customize:showPageLimitationXL'),
  112. },
  113. },
  114. };
  115. };
  116. export const getServerSideProps: GetServerSideProps = async(context: GetServerSidePropsContext) => {
  117. const [
  118. commonInitialResult,
  119. commonEachResult,
  120. basicLayoutResult,
  121. serverConfigResult,
  122. i18nPropsResult,
  123. ] = await Promise.all([
  124. getServerSideCommonInitialProps(context),
  125. getServerSideCommonEachProps(context),
  126. getServerSideBasicLayoutProps(context),
  127. getServerSideConfigurationProps(context),
  128. getServerSideI18nProps(context, ['translation', 'admin']),
  129. ]);
  130. return mergeGetServerSidePropsResults(commonInitialResult,
  131. mergeGetServerSidePropsResults(commonEachResult,
  132. mergeGetServerSidePropsResults(basicLayoutResult,
  133. mergeGetServerSidePropsResults(serverConfigResult, i18nPropsResult))));
  134. };
  135. export default MePage;